home *** CD-ROM | disk | FTP | other *** search
/ Total Java Scripts / Total Java Scripts.iso / JavaApplets / scrolls / CoolScroll / CoolScroll.java < prev    next >
Encoding:
Java Source  |  1998-10-31  |  7.5 KB  |  379 lines

  1. import java.applet.*;
  2. import java.awt.*;
  3. import java.awt.image.PixelGrabber;
  4. import java.awt.image.MemoryImageSource;
  5.  
  6.  
  7. public class CoolScroll extends Applet implements Runnable
  8. {
  9.     private Thread     m_CoolScroll = null;
  10.     
  11.     boolean asodreadisegna = false;
  12.  
  13.     private double rad = 20.0,
  14.                    rad_inc = 0.5,
  15.                    RAD =  3.1415926535 / 180,
  16.                    ang_x = 0.0,
  17.                    angolo_x = 0.0,
  18.                    inc_factor = 1.5;
  19.     
  20.  
  21.     int asciioffset = 0;
  22.     int veloce;
  23.     char msg[];
  24.     int msgbounceindex [];
  25.     int lametable[];
  26.  
  27.     int xadd = 0;
  28.     int scrollpos = 0;
  29.     int mirrorpic[],
  30.         swappic[];
  31.  
  32.     int startx = 0,
  33.         starty = 0,
  34.         msglenght;
  35.  
  36.     Color forecolor,
  37.           backcolor;    
  38.  
  39.     Image backdrop;
  40.     Image appletimage;
  41.     Image cropfont,
  42.           upperimage,
  43.           lowerimage;
  44.  
  45.     int redmaskadd = 90,
  46.         greenmaskadd = 120,
  47.         bluemaskadd = 140;
  48.  
  49.     int redadd = 5,
  50.         greenadd = 5,
  51.         blueadd = 5;
  52.  
  53.     Image letter;
  54.  
  55.     int extent_x,
  56.         extent_y;
  57.  
  58.     int letterwidth = 0,
  59.         letterheight = 0;
  60.  
  61.     private MemoryImageSource screenMem;
  62.  
  63.     Graphics gfx,
  64.              lettergfx,
  65.              appletgfx;
  66.  
  67.     public void init()
  68.     {
  69.         String messaggio;
  70.         messaggio = getParameter("scrolltext");
  71.  
  72.         if(messaggio == null)
  73.         {
  74.             messaggio="SAY SOMETHING TO THE WORLD...WRITE IT!";
  75.         }
  76.         veloce = Integer.parseInt(getParameter("scrollspeed"));
  77.         asciioffset = Integer.parseInt(getParameter("asciioffset"));
  78.         //Single letter build
  79.         letterwidth = Integer.parseInt(getParameter("fontx"));
  80.         letterheight = Integer.parseInt(getParameter("fonty"));
  81.         letter = createImage(letterwidth , letterheight );
  82.         lettergfx = letter.getGraphics();
  83.         //Single letter build
  84.         
  85.         appletimage = createImage(size().width , size().height);
  86.         appletgfx = appletimage.getGraphics();
  87.  
  88.         //Half scroll build
  89.         extent_x = size().width / 2;
  90.         extent_y = size().height / 4;
  91.         upperimage = createImage( extent_x , extent_y );
  92.         gfx = upperimage.getGraphics();
  93.         scrollpos = extent_x;
  94.         swappic = new int[extent_x * extent_y + extent_x];
  95.         mirrorpic = new int[extent_x * extent_y + extent_x];
  96.  
  97.         //Half scroll build
  98.  
  99.         //ScrollText build
  100.         msglenght = messaggio.length();    
  101.         msg = new char[msglenght+1];
  102.         //Get ready to bounce...
  103.         msgbounceindex = new int[msglenght+1];
  104.         lametable = new int[16];
  105.         loadlameBounce();
  106.         int nowind = 0;
  107.         for (int loop=0; loop < msglenght; loop++)
  108.         {
  109.             msgbounceindex[loop] = nowind;
  110.             if(++nowind>15)
  111.                 nowind = 0;
  112.         }
  113.  
  114.  
  115.         
  116.  
  117.         msg = messaggio.toCharArray();
  118.         //ScrollText build
  119.  
  120.         MediaTracker tracker = new MediaTracker(this);
  121.  
  122.         cropfont = getImage(getDocumentBase(), getParameter("fontimage"));
  123.         tracker.addImage(cropfont, 0);
  124.         try 
  125.         {
  126.             tracker.waitForID(0);
  127.         }
  128.         catch (InterruptedException e)
  129.         {
  130.  
  131.         }
  132.         
  133.         MediaTracker tracker2 = new MediaTracker(this);
  134.  
  135.         backdrop = getImage(getDocumentBase(), getParameter("backimage"));
  136.         tracker2.addImage(backdrop, 1);
  137.         try 
  138.         {
  139.             tracker2.waitForID(1);
  140.         }
  141.         catch (InterruptedException e)
  142.         {
  143.  
  144.         }
  145.  
  146.         forecolor = new Color(255,0,0);
  147.         backcolor = new Color(0,0,0);
  148.  
  149.         screenMem = new MemoryImageSource(extent_x, 
  150.                                             extent_y, 
  151.                                           mirrorpic, 
  152.                                           0, 
  153.                                           extent_x);
  154.  
  155.  
  156.     }
  157.  
  158.     public void update(Graphics g)
  159.     {
  160.         gfx.drawImage(backdrop,0,0,this);
  161.         BounceScroll();
  162.         loadPix();
  163.         renderPix();
  164.         appletgfx.drawImage(upperimage,0,0, extent_x * 2, extent_y * 2, this);
  165.         appletgfx.drawImage(lowerimage,0,extent_y*2, extent_x * 2, (extent_y * 2)+xadd, this);
  166.         paint(g);
  167.     }
  168.  
  169.  
  170.     public void paint(Graphics g)
  171.     {
  172.         if (appletgfx  != null)
  173.         {
  174.             g.drawImage(appletimage ,0,0, this);
  175.             
  176.         }
  177.     }
  178.  
  179.     public void start()
  180.     {
  181.         if (m_CoolScroll == null)
  182.         {
  183.             m_CoolScroll = new Thread(this);
  184.             m_CoolScroll.start();
  185.         }
  186.     }
  187.     
  188.     public void stop()
  189.     {
  190.         if (m_CoolScroll != null)
  191.         {
  192.             m_CoolScroll.stop();
  193.             m_CoolScroll = null;
  194.         }
  195.     }
  196.  
  197.     public void run()
  198.     {
  199.         while (true)
  200.         {
  201.             try
  202.             {
  203.                 repaint();
  204.                 Thread.sleep(50);
  205.                 System.gc();
  206.             }
  207.             catch (InterruptedException e)
  208.             {
  209.                 stop();
  210.             }
  211.         }
  212.     }
  213.  
  214.  
  215.     private void loadPix()
  216.     {
  217.         int punto = 0;
  218.         int themask = 0;
  219.         asodreadisegna = true;
  220.         
  221.         PixelGrabber grabber = new PixelGrabber( upperimage, 
  222.                                                  0, 
  223.                                                  0, 
  224.                                                  extent_x, 
  225.                                                  extent_y, 
  226.                                                  swappic , 
  227.                                                  0, 
  228.                                                  extent_x);
  229.         boolean done = false;
  230.         do
  231.         {
  232.             try 
  233.             { 
  234.                 done = grabber.grabPixels( 500 );  
  235.             } 
  236.             catch ( InterruptedException e ) {}
  237.         }
  238.         while( !done );
  239.  
  240.  
  241.         asodreadisegna = false;
  242.  
  243.     }
  244.  
  245.     private void renderPix()
  246.     {
  247.         int punto = 0;
  248.         int themask = 0;
  249.         int red = 0;
  250.         int green = 0;
  251.         int blue = 0;
  252.         int yindex = extent_y-1;
  253.  
  254.         redmaskadd += redadd;
  255.         greenmaskadd += greenadd;
  256.         bluemaskadd += blueadd;
  257.         
  258.         if(redmaskadd == 255 || redmaskadd == 90 )
  259.             redadd = redadd * -1;
  260.  
  261.         if(greenmaskadd == 255 || greenmaskadd == 90 )
  262.             greenadd = greenadd * -1;
  263.  
  264.         if(bluemaskadd == 255 || bluemaskadd == 90 )
  265.             blueadd = blueadd * -1;
  266.  
  267.         for(int loopy = 0; loopy < extent_y; loopy++)
  268.         {
  269.             for(int loopx = 0; loopx < extent_x; loopx++)
  270.             {
  271.                 punto = swappic[extent_x * yindex + loopx];
  272.  
  273.                 themask = punto & 0x00ff0000;
  274.                 red = themask >> 16;
  275.  
  276.                 themask = punto & 0x0000ff00;
  277.                 green = themask >> 8;
  278.  
  279.                 themask = punto & 0x000000ff;
  280.                 blue = themask;
  281.                 
  282.                 //red = blue;
  283.                 //green = blue;
  284.                 red = red;
  285.                 green = green;
  286.  
  287.                 red = (int)((red * redmaskadd)<<8);
  288.                 green = (int)((green * greenmaskadd));
  289.                 blue = (int)((blue * bluemaskadd)>>8);
  290.  
  291.                 
  292.  
  293.                 
  294.                 mirrorpic[extent_x * loopy + loopx] = 0xff000000 |(red & 0x00ff0000) | (green & 0x0000ff00) | (blue & 0xff);
  295.  
  296.             }
  297.             yindex--;
  298.         }
  299.  
  300.         lowerimage = createImage(screenMem);
  301.     }
  302.  
  303.     // Lame Pre-Calc bounce table....
  304.     private void loadlameBounce()
  305.     {
  306.         lametable[0] = 0;
  307.         lametable[1] = 0;
  308.         lametable[2] = 0;
  309.         lametable[3] = 1;
  310.         lametable[4] = 1;
  311.         lametable[5] = 2;
  312.         lametable[6] = 4;
  313.         lametable[7] = 6;
  314.         lametable[8] = 10;
  315.         lametable[9] = 15;
  316.         lametable[10] = 10;
  317.         lametable[11] = 6;
  318.         lametable[12] = 4;
  319.         lametable[13] = 2;
  320.         lametable[14] = 1;
  321.         lametable[15] = 1;
  322.     }
  323.  
  324.     private void BounceScroll()
  325.     {
  326.         int retval = 0;
  327.         double CX;
  328.         
  329.  
  330.         for (int loopx = 0; loopx < msglenght; loopx++)
  331.         {
  332.             if( scrollpos + (loopx * letterwidth ) < extent_x && scrollpos + (loopx * letterwidth ) > letterwidth * -1)
  333.             {
  334.                 getletterIndex((int)msg[loopx]);
  335.                 
  336.                 //Simulating transparent color....
  337.                 lettergfx.drawImage(backdrop, -(scrollpos + (loopx * letterwidth)), -(1+lametable [msgbounceindex[loopx]]),this);
  338.                 lettergfx.drawImage(cropfont, -(startx * letterwidth), -(starty * letterheight),this);
  339.                 gfx.drawImage(letter,scrollpos + (loopx * letterwidth),1+lametable [msgbounceindex[loopx]],this);
  340.  
  341.                 lettergfx.fillRect(0,0,letterwidth, letterheight);
  342.             }                
  343.             if(++msgbounceindex[loopx] > 15)
  344.                 msgbounceindex[loopx] = 0;
  345.         }
  346.  
  347.         scrollpos -= veloce;
  348.         if(scrollpos * -1 > msglenght * letterwidth)
  349.             scrollpos = extent_x;
  350.  
  351.         //sinus stuff
  352.         angolo_x += inc_factor;
  353.         if (angolo_x > 90 || angolo_x < 0)                
  354.         {
  355.             inc_factor = inc_factor * -1;
  356.         }
  357.         CX = Math.cos((angolo_x ) * RAD);
  358.         xadd  = (int)(angolo_x * CX);
  359.         //end of sinus stuff
  360.     }
  361.  
  362.     private void getletterIndex(int ASCIIcode)
  363.     {
  364.         int retval = 0;
  365.         retval = ((int)ASCIIcode)-asciioffset;
  366.         if(retval<=0)
  367.         {
  368.             startx = 0;
  369.             starty = 0;
  370.         }
  371.         else
  372.         {
  373.             starty = ((int)(retval / 10));
  374.             startx = (retval%10);
  375.         }
  376.  
  377.     }
  378. }
  379.